function sortTable(sTableId,iCol)
{
    var oTable=document.getElementById(sTableId);
    var oTBody=oTable.tBodies[0];
    var colDataRows=oTBody.rows;
    var aTrs=new Array;
    
    for(var i=0;i<colDataRows.length;i++)
    {
       aTrs[i]=colDataRows[i];
    }
    
    aTrs.sort(generateCompareTRs(iCol));
    
    if(oTable.sortCol==iCol)
       aTrs[i].reverse();
    else
    {
       var oFragment=document.createDocumentFragment();
    }
    
    for(var i=0;i<aTrs.length;i++)
    {
      oFragment.appendChild(aTrs[i]);
    }
    
    oTBody.appendChild(oFragment);
    oTable.sortCol=iCol;
}
function generateCompareTRs(iCol,sDataType)
{
   return function compareTRs(oTr1,oTr2)
          {
              var vValue1,vValue2;
              if(oTr1.cells[iCol].getAttribute("value"))
              {
                 vValue1=convert(oTr1.cells[iCol].getAttribute("value"),sDataType);
                 vValue2=convert(oTr2.cells[iCol].getAttribute("value"),sDataType);
              }
              else
              {
                 vValue1=convert(oTr1.cells[iCol].firstChild.nodeValue,sDataType);
                 vValue2=convert(oTr2.cells[iCol].firstChild.nodeValue,sDataType);
              }
              if(vValue1<vValue2) return -1;
              else if(vValue1>vValue2) return 1;
              else return 0;
          }        
}
function convert(sValue,sDataType)
{
   switch(sDataType)
   {
       case "int": return parseInt(sValue);
       case "float": return parseFloat(sValue);
       case "date": return new Date(Date.parse(sValue));
       default: return sValue.toString();
   }
}